package cn.kgc.spring.day05.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author 课工场
 * @date 2024/7/17
 * @description  增强时间的提示的业务类  通知类
 */
@Component
@Aspect
public class TimeAdvice {

    // 定义一个公共的切点表达式
    // @Pointcut("execution( * cn.kgc.spring.day05.service.impl.TeacherServiceImpl.teach*(..))")
    @Pointcut("@annotation(cn.kgc.spring.day05.annotations.Time)")
    public void point(){}

    // 前置通知
    // @Before("execution( * cn.kgc.spring.day05.service.impl.TeacherServiceImpl.teach*(..))")
    public void  beforeAdvice(){
        System.out.println("上课时间到了,请开始上课...");
    }

    // 后置通知
    // @AfterReturning("execution( * cn.kgc.spring.day05.service.impl.TeacherServiceImpl.teach*(..))")
    public void  afterReturningAdvice(){
        System.out.println("下课时间到了,请准时下课...");
    }


    // 最终通知
    // @After("execution( * cn.kgc.spring.day05.service.impl.TeacherServiceImpl.teach*(..))")
    public void  afterAdvice(){
        System.out.println("-----------最终通知-------------");
    }

    // 异常通知    目标方法执行抛出异常时 增强
    // @AfterThrowing("execution( * cn.kgc.spring.day05.service.impl.TeacherServiceImpl.teach*(..))")
    public void  afterThrowing(){
        System.out.println("-----------异常通知-------------");
    }


    // 环绕通知     point()  引用公共的切点表达式
    @Around("point()")
    public Object  aroundAdvice(ProceedingJoinPoint proceedingJoinPoint){


        try {
            System.out.println("上课时间到了,请开始上课...");

            // 目标方法的执行
            Object proceed = proceedingJoinPoint.proceed();

            System.out.println("下课时间到了,请准时下课...");
            return proceed;
        } catch (Throwable e) {
            System.out.println("-----------异常通知-------------");
            throw new RuntimeException(e);
        }finally {
            System.out.println("-----------最终通知-------------");
        }

    }
}
